#include <stdbool.h>
#include <libpq-fe.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "common.h"

// 连接两个字符串
char* join3(char *s1, char *s2)
{
    char *result = malloc(strlen(s1)+strlen(s2)+1);
    if (result == NULL) exit (1);

    strcpy(result, s1);
    strcat(result, s2);

    return result;
}

int get_id_by_username(char* username)
{
    // 连接postgresql数据库
    PGconn *conn = PQconnectdb("user=postgres password=postgres@1234 dbname=user_db hostaddr=121.43.33.73");
    if (PQstatus(conn) == CONNECTION_BAD) {
        fprintf(stderr, "Connection to database failed: %s\n",
            PQerrorMessage(conn));
        exit(conn);
    }
    // 向服务器执行命令
    char* command=join3("select user_id from user_tb where username='",username);
    command=join3(command,"'");
    // printf("\n%s",command);
    PGresult *res = PQexec(conn,command);
    // printf("%d",PQresultStatus(res));
    if (PQresultStatus(res) != PGRES_TUPLES_OK) {
        fprintf(stderr,"Can't exec command %s \n%s",command,PQerrorMessage(conn));
        exit(conn);
    }
    if(res==NULL) return false;
    
    // 获取返回值列数
    int nFields = PQnfields(res);
    // printf("column is %d\n",nFields);
    // 获取返回值行数
    int ntuples= PQntuples(res);
    // printf("row is %d\n",ntuples);
    if(nFields!=1 || ntuples!=1) return false;
    // 获取返回值
    int ret_id=atoi(PQgetvalue(res, 0, 0));
    PQfinish(conn);
    // printf("\n%s ",PQgetvalue(res,0,0));
    printf("\n%d ",ret_id);
    return ret_id;

    
}

// 验证用户名及密码是否正确
bool check_user_passwd(struct USER_PASSWD* user_info)
{
    // 连接postgresql数据库
    PGconn *conn = PQconnectdb("user=postgres password=postgres@1234 dbname=user_db hostaddr=121.43.33.73");
    if (PQstatus(conn) == CONNECTION_BAD) {
        fprintf(stderr, "Connection to database failed: %s\n",
            PQerrorMessage(conn));
        exit(conn);
    }
    // 获取postgresql版本信息
    int ver = PQserverVersion(conn);
    printf("Server version: %d\n", ver);
    // 向服务器执行命令
    char* command=join3("select password from user_tb where username='",user_info->username);
    command=join3(command,"'");
    // printf("\n%s",command);
    PGresult *res = PQexec(conn,command);
    // printf("%d",PQresultStatus(res));
    if (PQresultStatus(res) != PGRES_TUPLES_OK) {
        fprintf(stderr,"Can't exec command %s \n%s",command,PQerrorMessage(conn));
        exit(conn);
    }
    if(res==NULL) return false;
    
    // 获取返回值列数
    int nFields = PQnfields(res);
    // printf("column is %d\n",nFields);
    // 获取返回值行数
    int ntuples= PQntuples(res);
    // printf("row is %d\n",ntuples);
    if(nFields!=1 || ntuples!=1) return false;
    // 获取返回值
    if(strcmp(PQgetvalue(res, 0, 0), user_info->password) == 0) 
    {
        // printf("%s\n", PQgetvalue(res, 0, 0));
        // printf("%s\n",user_info->password);
        // 关闭数据库连接
        PQfinish(conn);
        return true;
    
    }
    return false;
}